/***********************************************************************************************************************
 * ############################################# Application AdewebLite #############################################
 * AdewebLite Android est une application permettant de consulter des emplois du temps fournis par l'université UHP
 * avec ou sans connexion internet (informations gardées en mémoire à chaque synchronisation). Et utilisant la web
 * API ADE pour collecter les données.
 * @author Andrianjafintrimo Victor, Zanette Sébastien
 * 
 * Basée sur l'application du même nom, utilisant le flux RSS (données à traiter), de :
 * @author Schnell Michaël, Zanette Sébastien
 * **********************************************************************************************************************
 */

package ade.prime.analyzer;

import java.util.ArrayList;
import java.util.Iterator;

/**
 * Classe représentant le flux de données qui contient les informations d'un
 * ensemble de ressources
 *
 * @author Zanette Sébastien, Andrianjafintrimo Victor
 */
public class FeedResources extends Feed implements Iterable<FeedResource> {

    private ArrayList<FeedResource> resources;

    /**
     * Constructeur de la classe FeedResources, initialise le champ resources
     */
    public FeedResources() {
        this.resources = new ArrayList<FeedResource>();
    }

    /**
     * Ajoute une ressource à la liste de {@code FeedResource}
     *
     * @param resource resource à ajouter
     */
    public void addResource(FeedResource resource) {
        this.resources.add(resource);
    }

    /**
     * Retourne une chaîne de caractères avec les informations des différentes
     * ressources
     *
     * @return chaîne de caractères
     */
    @Override
    public String toString() {
        StringBuilder s = new StringBuilder();
        for (FeedResource feedResource : resources) {
            s.append(feedResource.toString());
            s.append("\n");
        }
        return s.toString();
    }

    /**
     * Retourne le nombre de ressources dans la liste de lressource
     * @return le nombre de ressources contenu dans la liste
     */
    public int size() {
        return this.resources.size();
    }// size()

    /**
     * Retourne la ressource à l'indice i
     * @param i indice de la ressource à retourner
     * @return {@code FeedResource} à l'indice i
     */
    public FeedResource get(int i) {
        return this.resources.get(i);
    }// get(int)

    /**
     * Retourne un itérateur de {@code FeedResource}
     * @return un itérateur de {@code FeedResource}
     */
    public Iterator<FeedResource> iterator() {
        return new FeedResourceIterator(this);
    }

    /**
     * Classe correspondant à un itérateur de {@code FeedResource}
     */
    class FeedResourceIterator implements Iterator<FeedResource> {

        protected int next;
        protected FeedResources feedResources;

        /**
         * Constructeur de la classe FeedResourceIterator
         * @param r liste de ressources sur laquelle on souhaite itérer
         */
        public FeedResourceIterator(FeedResources r) {
            this.next = 0;
            this.feedResources = r;
        }

        /**
         * Permet de savoir s'il existe une ressource suivant dans la liste
         * @return vrai s'il existe un ressource après la ressource courante dans la liste, faux sinon
         */
        public boolean hasNext() {
            return (this.next < this.feedResources.size());
        }

        /**
         * Retourne la ressource suivante
         * @return {@code FeedResource} se trouvant après la ressource courante dans la liste
         */
        public FeedResource next() {
            int next = this.next;
            this.next++;
            return this.feedResources.get(next);
        }

        /**
         * Supprime une ressource de la liste de ressources
         */
        public void remove() {
            throw new UnsupportedOperationException("FeedResourceIterator.remove n'a pas été implanté.");
        }
    }
}
